import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: DELL
 * Date: 2023-03-13
 * Time: 7:17
 */

class Student {

    // 这个类里的属性必须是public 或者带有 public 的getter / setter 否则json无法访问
    public int studentId;
    public String studentName;
    // 所构造的对象必须是 body 里构造的相同(名字与类型都应相同)

    // 里面的构造方法不写即为无参版本构造器 且必须为无参版本

}

@WebServlet("/json")
public class JacksonServlet extends HolleServlet{
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 从请求 body 里面获取一些参数
        // 例如格式为 {"studentId": 10 , "studentName" : 张三 }

        // 一个重要类
        ObjectMapper objectMapper = new ObjectMapper();

        // 第一个参数可以使字符串 也可以是输入流 第二个参数是一个类对象即为要解析的结果的类对象
        Student s = objectMapper.readValue(req.getInputStream(), Student.class);
                                                                 // 类对象可以解析到类里的属性
        // 1.读取输入流, 获取到需要解析的字符串
        // 2. 把字符串按照json格式解析, 得到一组键值对
        // 3. 根据类对象创建一个实例
        // 4. 遍历类对象中的属性的名字, 拿着名字去键值对中查询, 查到的value就赋值到对应的对象属性中
        // 5. 返回这个构造完成的对象

        System.out.println(s.studentId);
        System.out.println(s.studentName);

        // 两个重要方法 readValue方法, 把 json 格式数据转成 java 的对象
        // writerValueAsString方法, 把 java 对象转为 json 格式的字符串

//        resp.setContentType("text/html; charset=utf8");
//        resp.getWriter().write(s.studentId + " ," + s.studentName);
        resp.setContentType("application/json; charset=utf8");
        // 先把s对象转为json格式字符串在转为流对象
        resp.getWriter().write(objectMapper.writeValueAsString(s));
        // 把对象一边转一边写入流对象中
//        objectMapper.writeValue(resp.getWriter(),s);
    }

}
